#include "Buffer.h"
#include	<string.h>
#include	<stdio.h>
#include	<arpa/inet.h>



string
Buffer::drain(const BufferDrainerPtr& drainer)
{
	string result;
	if (!drainer) {
		result = _data;
		_data.clear();
		return result;
	}	
	uint32_t length = drainer->drain(_data);
    if (length <= 0 || _data.size() < length) {
		return result;
	} else {
		result.assign(_data, 0, length);
		_data.erase(0, length+1);
		return result;
	}
}

string
Buffer::drain()
{
	string result;
	if(_data.size() == 0) {
		return result;
	}
	if(_dataLength == 0 && _data.size()>=4) {
		memcpy(&_dataLength,(char*)_data.c_str(),4);
		_dataLength = ntohl( _dataLength );
        printf ( "_dataLength = %d\n", _dataLength );
	}
	if(_dataLength <= 0 || _dataLength >= 8192*1000 ) {
		result = _data;
		_data.clear();
		return result;
	}
	if(_data.size() < _dataLength) {
		return result;
	} else {
		result.assign(_data, 0, _dataLength);
		_data.erase(0, _dataLength);
		_dataLength = 0;
		return result;
	}
}

void
Buffer::insert(const string& data)
{
	_data.insert(0, data);
}

void
Buffer::append(const string& data)
{
	_data.append(data);
//	if (_data.capacity() > (_data.size() * 3)) {
//		string(_data).swap(_data);
//	}
}

void
Buffer::append(const char* data, int length)
{
	_data.append(data, length);
//	if (_data.capacity() > (_data.size() * 3)) {
//		string(_data).swap(_data);
//	}
}

void
Buffer::clear()
{
	_data.clear();
}
int 
Buffer::size()
{
    return _data.size();
}

/*
int 
Buffer::getDataLength()
{
	IceUtil::Mutex::Lock lock(_mutex);
	return _dataLength;
}
*/


